#include <iostream>
using namespace std;
class Point
{
public:
  Point();
  Point(int vx, int vy);
  Point &operator++();    // 重载前置自增为类的成员函数
  Point &operator++(int); // 重载后置自增为类的成员函数
  // 重载前置自减为类的友元函数
  friend Point& operator--(Point & p1);
  // 重载后置自减为类的友元函数
  friend Point& operator--(Point &p1, int);
  void display();

private:
  int x, y;
};
Point::Point()
{
  x = 0;
  y = 0;
}
Point::Point(int vx, int vy)
{
  x = vx;
  y = vy;
}
void Point::display()
{
  cout << " (" << x << "," << y << ") " << endl;
}
Point &Point::operator++() // 前置自增
{
  if (x < 640)
    x++; // 不超过屏幕的横界
  if (y < 480)
    y++; // 不超过屏幕的竖界 return *this;
  return *this;
}
Point &Point::operator++(int) // 后置自增
{                             // 先将当前对象通过复制构造函数临时保存起来
  Point temp(*this);
  if (x < 640)
    x++; // 不超过屏幕的横界
  if (y < 480)
    y++; // 不超过屏幕的竖界
  return temp;
}
Point &operator--(Point &p) // 前置自减
{
  if (p.x > 0)
    p.x--;
  if (p.y > 0)
    p.y--;
  return p;
}
Point& operator--(Point &p, int) // 后置自减
{                               // 先将当前对象通过复制构造函数临时保存起来
  Point temp(p);
  if (p.x > 0)
    p.x--;
  if (p.y > 0)
    p.y--;
  return temp;
}
int main()
{
  Point p1(10, 10), p2(150, 150), p3(20, 20),
      p4(160, 160), p5;
  cout << "p1=";
  p1.display();
  ++p1; // 测试前置自增
  cout << "++p1=";
  p1.display();
  cout << "p3=";
  p3.display();
  p5 = p3++; // 测试后置自增
  cout << " p3++=";
  p3.display();
  cout << "p5=p3++=";
  p5.display();
  cout << "p2=";
  p2.display();
  --p2; // 测试前置自减
  cout << "--p2=";
  p2.display();
  cout << "p4=";
  p4.display();
  p5 = p4--; // 测试后置自增
  cout << " p4--=";
  p4.display();
  cout << " p5= p4--=";
  p5.display();
  return 0;
}
